#include <stdio.h>
#include <stdlib.h>

#define MAX_TREE_SIZE 100

/**
基本树的表示方法

1、双亲表示法（顺序存储）
每个结点保存指向双亲的指针
 */
typedef struct
{
    int data;
    int parent;
} PTNode;

typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];
    int n;
} PTree;
// data   parent
// A       -1
// B       0
// C       0
// D       0
// E       1
// F       4
/*
删除结点：
1、把后序元素一次往前移动
2、把该节点的父指针指向-1
若删除的结点不是叶子结点：
那么就要删除以该结点为根的子树，需要递归删除

*/

/*
2、孩子表示法（顺序+链式存储）
顺序存储每个结点，每个结点中保存孩子链表头指针
存储每个结点到数组中：每个数组元素指向该结点的第一个孩子，第一个孩子一次指向右边的孩子

*/
struct CTNode
{
    int child; //孩子结点在数组中的位置
    struct CTNode *next;
};
typedef struct
{
    int data;
    struct CTNode *firstChild; //第一个孩子
} CTBox;
typedef struct
{
    CTBox nodes[MAX_TREE_SIZE];
    int n, r; //结点数和结点根的位置
} CTree;

/*
3、孩子兄弟表示法（链式存储）

*/
typedef struct CSNode
{
    int data;                                //数据域
    struct CSNode *firstChild, *nextSibling; //第一个孩子和右兄弟（第一个孩子的右边第一个兄弟）指针
} CSNode, *CSTree;

//树和二叉树的转换
/*
用孩子兄弟表示法，出来的树就是二叉树
*/

//森林和二叉树的转换
/*
把所有树的根结点看做同一结点的孩子，及它们是兄弟关系，再转换为二叉树
*/



int main()
{
    printf("\n\n========================================================================\n\n");

    printf("\n\n========================================================================\n\n");
    return 0;
}